要讓C source code能夠跑在硬體的CPU上面,首先需要把C code轉換成CPU能看得懂的語言: machine code。一整套把C source code轉換成machine code的工具,就稱為compilation toolchain
。Toolchain (工具鍊)
是指前一項工具的輸出是後一項工具的輸入,以此串成了一個鍊。
示意圖: 一個compilation toolchain的"鍊"
接著我們介紹要將C source code轉換成machine code需要經過哪些步驟、用到哪些tools、以及它們分別有什麼功能。
一個大型軟體專案當中,需要被編譯的source code數量非常多,這時候會面臨幾個問題
負責將C source code轉成assembly code的tool,在編譯過程中,主要的工作是對C source code做字彙分析 (Lexical Analysis)、語法分析 (Parsing)、語意分析 (Semantic analysis)、產生中間碼 (Intermedia code generation)、程式碼最佳化 (Optimization)、產生組合語言程式碼 (Code generation)六大步驟。
負責將assembly code轉成object code (machine code)的tool,assembler產生出來的檔案為object file,其附檔名為.o/.obj。Assembler會挑選最短、最適合的machine code,才可以讓CPU有最高執行的效率 (指令size越小,同樣memory/cache size內就可以放更多指令,要執行的指令都在cache裡面,cache hit rate上升),常見的assembler: as (GNU assembler)。
一套軟體是可以由多支原始碼撰寫而成的,而這些原始碼是被分開編譯的,所以要有一套工具將這些原始碼的編譯結果 (object file) 組合起來。有一些linker支援link time optimization (LTO)的功能,因為linker看到的資料比compiler更廣更齊全,LTO能夠把沒有用到的資料、程式去除,或者再決定一次哪些function適合被inline等等最佳化。最常見的linker: ld (GNU linker)。